package org.atlantis.net.base.echoudp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

/*
 * 创建一个典型的UDP服务端，主要分为以下3个大致步骤：
 * 1.创建一个DatagramSocket实例，指定本地端口号，并可以选择指定本地地址。此时，服务器已经准备好从任何客户端接收数据报文。
 * 2.使用DatagramSocket类的receive方法来接收一个DatagramPacket实例。当receive方法返回时，数据报文就包含了客户端的地址，这样
 * 就能知道了回复信息应该发送到什么地方。
 * 3.使用DatagramSocket类的send和receive方法来发送和接收DatagramSocket实例，进行通信。
 */
public class UDPEchoServer {

	private static final int SERVER_PORT = 10006;

	// 最多只接受和发送数据报文中的前255个字符，超出的部分将无提示的丢弃
	private static final int ECHOMAX = 255;

	public static void main(String[] args) throws Exception {
		// IP地址只能用本机的所有不用指定，但是如果一个网卡绑定了多个IP的话就需要指定，否则它会随机自动选择一个
		DatagramSocket socket = new DatagramSocket(SERVER_PORT);
		DatagramPacket packet = new DatagramPacket(new byte[ECHOMAX], ECHOMAX);

		while (true) { // 循环接收UDP客户端传送来的报文数据
			socket.receive(packet);
			System.out.println("Handling client at "
					+ packet.getAddress().getHostAddress() + " on port "
					+ packet.getPort());
			socket.send(packet); // 将接收到的数据回执给UDP客户端
			// 处理了接收到的消息后，数据包（DatagramPacket）的内部长度将被设置为刚处理过的消息的长度。所以重置DatagramPacket的长度，清空其缓存
			packet.setLength(ECHOMAX);
		}
	}
}
